package com.atguigu.gmall.search.vo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Data
@Document(indexName = "goods" , shards = 3 , replicas = 2)
public class Goods { //goods对应一个检索页面 一个sku的所有数据
    //自定义类的属性名设计：
    // 1、如果字段和数据库表有交互使用表的实体类的属性名
    // 2、一个实体类中有多张表的数据为了区分不同表的字段 使用表名作为前缀
    // 3、如果字段不和数据库交互 需要和前端页面进行交互，需要和前端一起设计商量
    //Goods类中的数据需要和数据库交互 前端也需要查询展示使用  所以设计时需要和 前端、技术经理、后端一起设计
    //1、sku表中的数据
    @Id
    private Long skuId;
    @Field(type = FieldType.Keyword)
    private String defaultImage;
    @Field(type = FieldType.Text , analyzer = "ik_max_word")//FieldType.Text 必须制定analyzer
    private String title;
    @Field(type = FieldType.Keyword)
    private String subtitle;
    @Field(type = FieldType.Double)
    private Double price;
    //2、排序相关
    @Field(type = FieldType.Long)
    private Long sales = 0L;
    // DateFormat.date : yyyy-MM-dd
    @Field(type = FieldType.Date , format = DateFormat.date) // FieldType.Date 必须指定时间日期格式
    private Date createTime;
    @Field(type = FieldType.Boolean)
    private Boolean store = false;
    //3、sku的品牌
    @Field(type = FieldType.Long)
    private Long brandId;
    @Field(type = FieldType.Keyword)
    private String brandName;
    @Field(type = FieldType.Keyword)
    private String logo;
    //4、sku的分类
    @Field(type = FieldType.Long)
    private Long categoryId;
    @Field(type = FieldType.Keyword)
    private String categoryName;
    //3、检索属性：spu+sku
    //每个检索属性都需要 属性id  属性值 属性名
    // es: 1:n的关系  ?????
    // 如果使用FieldType.Object会导致 数据扁平化
    // FieldType.Object  1：n的数据会当做一个文档存到es中
    //FieldType.Nested  1：n的数据 可以以n的方式形成多个文档保存到es中
    @Field(type = FieldType.Nested)
    List<SearchAttrVo> searchAttrs = new ArrayList<>();
}
